package middleware

import (
	"net/http"
	"rego-top/dto"

	"github.com/gin-gonic/gin"
)

// RequireRole 要求特定角色的中间件
func RequireRole(roleName string) gin.HandlerFunc {
	return func(c *gin.Context) {
		user, exists := GetCurrentUser(c)
		if !exists {
			c.JSON(http.StatusUnauthorized, dto.ErrorResponse("未认证", nil))
			c.Abort()
			return
		}

		if !user.HasRole(roleName) {
			c.JSON(http.StatusForbidden, dto.ErrorResponse("权限不足", "需要角色: "+roleName))
			c.Abort()
			return
		}

		c.Next()
	}
}

// RequirePermission 要求特定权限的中间件
func RequirePermission(permissionName string) gin.HandlerFunc {
	return func(c *gin.Context) {
		user, exists := GetCurrentUser(c)
		if !exists {
			c.JSON(http.StatusUnauthorized, dto.ErrorResponse("未认证", nil))
			c.Abort()
			return
		}

		if !user.HasPermission(permissionName) {
			c.JSON(http.StatusForbidden, dto.ErrorResponse("权限不足", "需要权限: "+permissionName))
			c.Abort()
			return
		}

		c.Next()
	}
}

// RequireAnyRole 要求任意一个角色的中间件
func RequireAnyRole(roleNames ...string) gin.HandlerFunc {
	return func(c *gin.Context) {
		user, exists := GetCurrentUser(c)
		if !exists {
			c.JSON(http.StatusUnauthorized, dto.ErrorResponse("未认证", nil))
			c.Abort()
			return
		}

		hasRole := false
		for _, roleName := range roleNames {
			if user.HasRole(roleName) {
				hasRole = true
				break
			}
		}

		if !hasRole {
			c.JSON(http.StatusForbidden, dto.ErrorResponse("权限不足", "需要以下任意角色之一"))
			c.Abort()
			return
		}

		c.Next()
	}
}

// RequireAnyPermission 要求任意一个权限的中间件
func RequireAnyPermission(permissionNames ...string) gin.HandlerFunc {
	return func(c *gin.Context) {
		user, exists := GetCurrentUser(c)
		if !exists {
			c.JSON(http.StatusUnauthorized, dto.ErrorResponse("未认证", nil))
			c.Abort()
			return
		}

		hasPermission := false
		for _, permissionName := range permissionNames {
			if user.HasPermission(permissionName) {
				hasPermission = true
				break
			}
		}

		if !hasPermission {
			c.JSON(http.StatusForbidden, dto.ErrorResponse("权限不足", "需要以下任意权限之一"))
			c.Abort()
			return
		}

		c.Next()
	}
}

// RequireAdmin 要求管理员权限的中间件
func RequireAdmin() gin.HandlerFunc {
	return RequireRole("admin")
}

// RequireOwnerOrAdmin 要求资源所有者或管理员权限的中间件
func RequireOwnerOrAdmin(getResourceOwnerID func(*gin.Context) uint) gin.HandlerFunc {
	return func(c *gin.Context) {
		user, exists := GetCurrentUser(c)
		if !exists {
			c.JSON(http.StatusUnauthorized, dto.ErrorResponse("未认证", nil))
			c.Abort()
			return
		}

		// 检查是否是管理员
		if user.HasRole("admin") {
			c.Next()
			return
		}

		// 检查是否是资源所有者
		resourceOwnerID := getResourceOwnerID(c)
		if user.ID == resourceOwnerID {
			c.Next()
			return
		}

		c.JSON(http.StatusForbidden, dto.ErrorResponse("权限不足", "只有资源所有者或管理员可以访问"))
		c.Abort()
	}
}